package com.baomidou.kisso.common.bcprov.asn1;

import java.io.IOException;
import java.util.Enumeration;

/**
 * Note: this class is for processing DER/DL encoded sequences only.
 */
class LazyEncodedSequence extends ASN1Sequence {

	private byte[] encoded;


	LazyEncodedSequence( byte[] encoded ) throws IOException {
		this.encoded = encoded;
	}


	private void parse() {
		Enumeration en = new LazyConstructionEnumeration(encoded);

		while ( en.hasMoreElements() ) {
			seq.addElement(en.nextElement());
		}

		encoded = null;
	}


	public synchronized ASN1Encodable getObjectAt( int index ) {
		if ( encoded != null ) {
			parse();
		}

		return super.getObjectAt(index);
	}


	public synchronized Enumeration getObjects() {
		if ( encoded == null ) {
			return super.getObjects();
		}

		return new LazyConstructionEnumeration(encoded);
	}


	public synchronized int size() {
		if ( encoded != null ) {
			parse();
		}

		return super.size();
	}


	ASN1Primitive toDERObject() {
		if ( encoded != null ) {
			parse();
		}

		return super.toDERObject();
	}


	ASN1Primitive toDLObject() {
		if ( encoded != null ) {
			parse();
		}

		return super.toDLObject();
	}


	int encodedLength() throws IOException {
		if ( encoded != null ) {
			return 1 + StreamUtil.calculateBodyLength(encoded.length) + encoded.length;
		} else {
			return super.toDLObject().encodedLength();
		}
	}


	void encode( ASN1OutputStream out ) throws IOException {
		if ( encoded != null ) {
			out.writeEncoded(BERTags.SEQUENCE | BERTags.CONSTRUCTED, encoded);
		} else {
			super.toDLObject().encode(out);
		}
	}
}
